package com.xzs.kit.db.service.impl;

import com.github.pagehelper.PageHelper;
import com.xzs.kit.base.dao.BaseDao;
import com.xzs.kit.base.model.PageBean;
import com.xzs.kit.base.service.BaseService;
import com.xzs.kit.db.util.SpringUtil;


import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;

/**
 * @author : Victor.Xiao
 * @date : 2017/12/02 15:51
 * @description : 基础服务实现
 */
public class BaseServiceImpl<Dao extends BaseDao,Model> implements BaseService<Model> {

    private Dao dao;

    /**
     * @description : 查
     * @author : Victor.Xiao
     * @date : 2017/12/2 15:37
     * @param id id
     * @return
     */
    @Override
    public Model findById(String id){
        return (Model) dao.findById(id);
    }

    /**
     * @description : 查
     * @author : Victor.Xiao
     * @date : 2017/12/2 15:37
     * @param ids id
     * @return
     */
    @Override
    public List<Model> findBatch(List<String> ids){
        return dao.findBatch(ids);
    }

    /**
     * @description : 改
     * @author : Victor.Xiao
     * @date : 2017/12/2 15:37
     * @param model model
     * @return
     */
    @Override
    public void update(Model model){
        dao.update(model);
    }

    /**
     * @description : 改
     * @author : Victor.Xiao
     * @date : 2017/12/2 15:37
     * @param models model
     * @return
     */
    @Override
    public void updateBatch(List<Model> models){
        dao.updateBatch(models);
    }

    /**
     * @description : 增
     * @author : Victor.Xiao
     * @date : 2017/12/2 15:37
     * @param model model
     * @return
     */
    @Override
    public void add(Model model){
        dao.add(model);
    }

    /**
     * @description : 增
     * @author : Victor.Xiao
     * @date : 2017/12/2 15:37
     * @param models model
     * @return
     */
    @Override
    public void addBatch(List<Model> models){
        dao.addBatch(models);
    }

    /**
     * @description :
     * @author : Victor.Xiao
     * @date : 2017/12/2 16:09
     * @param params 参数
     * @param pageNum 页码
     * @param pageSize 大小
     * @return
     */
    @Override
    public PageBean<Model> findByPage(Map<String,Object> params, Integer pageNum, Integer pageSize){
        return findByPage(params,pageNum,pageSize,true);
    }

    /**
     * @description :
     * @author : Victor.Xiao
     * @date : 2017/12/2 16:09
     * @param params 参数
     * @param pageNum 页码
     * @param pageSize 大小
     * @param count 是否查询总数
     * @return
     */
    @Override
    public PageBean<Model> findByPage(Map<String,Object> params, Integer pageNum, Integer pageSize,boolean count){
        if(params!=null&&params.get("orderBy")!=null){
            PageHelper.orderBy(params.get("orderBy").toString());
        }
        PageHelper.startPage(pageNum, pageSize,count);
        List<Model> list = dao.findByPage(params);
        PageBean<Model> pageBean = new PageBean(list);
        return pageBean;
    }

    /**
     * @description : 分页查询
     * @author : Victor.Xiao
     * @date : 2017/12/15 9:47
     * @param pageBean 分页参数
     * @return
     */
    @Override
    public PageBean<Model> findByPage(PageBean<Model> pageBean){
        if(pageBean.getOrderBy()!=null&&!"".equals(pageBean.getOrderBy())){
            PageHelper.orderBy(pageBean.getOrderBy());
        }
        PageHelper.startPage(pageBean.getPageNo(), pageBean.getPageSize(),pageBean.getSelectCountFlag());
        List<Model> list = dao.findByPage(pageBean.getParams());
        pageBean.setList(list);
        return pageBean;
    }

    /**
     * @description : 分页
     * @author : Victor.Xiao
     * @date : 2017/12/2 16:12
     * @param params 参数
     * @param offset 开始条数
     * @param limit 限制条数
     * @return
     */
    @Override
    public PageBean<Model> findByOffset(Map<String,Object> params, Integer offset, Integer limit){
        return findByOffset(params, offset, limit,true);
    }

    /**
     * @description : 分页
     * @author : Victor.Xiao
     * @date : 2017/12/2 16:12
     * @param params 参数
     * @param offset 开始条数
     * @param limit 限制条数
     * @param count 总数
     * @return
     */
    @Override
    public PageBean<Model> findByOffset(Map<String,Object> params, Integer offset, Integer limit,boolean count){
        if(params!=null&&params.get("orderBy")!=null){
            PageHelper.orderBy(params.get("orderBy").toString());
        }
        PageHelper.offsetPage(offset, limit,count);
        List<Model> list = dao.findByPage(params);
        PageBean<Model> pageBean = new PageBean(list);
        return pageBean;
    }

    /**
     * @description : 删
     * @author : Victor.Xiao
     * @date : 2017/12/2 15:45
     * @param id id
     */
    @Override
    public void deleteById(String id){
        dao.deleteById(id);
    }

    /**
     * @description : 删
     * @author : Victor.Xiao
     * @date : 2017/12/2 15:45
     * @param ids ids
     */
    @Override
    public void deleteBatch(List<String> ids){
        dao.deleteBatch(ids);
    }

    /**
     * @description : 删
     * @author : Victor.Xiao
     * @date : 2017/12/2 15:45
     * @param params  params
     */
    @Override
    public void deleteByParam(Map<String,Object> params){
        dao.deleteByParam(params);
    }



    /**
     * @description : 初始化initDao
     * @author : Victor.Xiao
     * @date : 2017/12/2 16:51
     */
    @Override
    public void initDao() {
        this.dao = SpringUtil.getBean(getDaoClass());
    }

    /**
     * @description : 获取类泛型class
     * @author : Victor.Xiao
     * @date : 2017/12/2 16:54
     * @return
     */
    public Class<Dao> getDaoClass() {
        return (Class<Dao>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }
}
